extensions [time]
breed [boys boy]
breed [girls girl]
boys-own [
e-cons
room-id
status
M-in-hour
N-in-hour
]
girls-own [
e-cons
room-id
status
M-in-hour
N-in-hour
]
globals [
Start-time
Current-time
Weekend-name
in-out-rand
v-tick
x-tick
Outside
B-dorm
G-dorm
Laptop-B
Laptop-G
Phone-charger
Tablet-charger
Coffee-maker-Kettle
Light-bulb
Shaver
Hair_Dryer
Electric_Cooker
Morning-List-B
Morning-List-G
Night-List-B
Night-List-G
Morning-W-List-B
Morning-W-List-G
Night-W-List-B
Night-W-List-G
Laptop-Use-B
Kitchen-Use-B
Kettle-Use-B
Hair-Use-B
Laptop-Use-G
Kitchen-Use-G
Kettle-Use-G
Hair-Use-G
home-sick-B
home-sick-G
ar-late-B
Holiday-B
Holiday-G
]
to setup
clear-all
setup-patches
setup-turtles
setup-appliances
setup-time
initialize-time
reset-ticks
end
to setup-patches
set B-dorm patches with [pycor > 0 AND pxcor < 0]
ask B-dorm [set pcolor 99]
set G-dorm patches with [pycor > 0 AND pxcor > 0]
ask G-dorm [set pcolor 139]
set Outside patches with [pycor < 0]
ask Outside [set pcolor white]
end
to setup-turtles
create-boys b-number
ask boys [
set color blue
set e-cons 0
]
create-girls g-number
ask girls [
set color pink
set e-cons 0
]
ask turtles [move-to one-of Outside]
end
to setup-appliances
set Laptop-B 125
set Laptop-G 75
set Phone-charger 5
set Tablet-charger 15
set Coffee-maker-Kettle 1200
set Light-bulb 50
set Shaver 15
set Hair_Dryer 1250
set Electric_Cooker 1500
end
to setup-time
set Start-time time:create "2016-09-19 00:00:00"
set Current-time time:anchor-to-ticks Start-time 1 "hour"
file-open "Hours-B.txt"
set Morning-List-B file-read
set Night-List-B file-read
set Morning-W-List-B file-read
set Night-W-List-B file-read
file-close
file-open "Hours-G.txt"
set Morning-List-G file-read
set Night-List-G file-read
set Morning-W-List-G file-read
set Night-W-List-G file-read
file-close
file-open "E_D-B.txt"
set Laptop-Use-B file-read
set Kitchen-Use-B file-read
set Kettle-Use-B file-read
set Hair-Use-B file-read
file-close
file-open "E_D-G.txt"
set Laptop-Use-G file-read
set Kitchen-Use-G file-read
set Kettle-Use-G file-read
set Hair-Use-G file-read
file-close
;;Lines: 1: Computer, 2: Kitchen, 3: Kettle, 4:Hair_Dryer;;
end
to go
check-sleep
check-location
move-turtles
consume-energy
tick
set x-tick ticks mod 24
check-day
show-time
end
to check-day
if (ticks < 169) [set v-tick ticks]
ifelse (ticks mod 168 = 0) [set v-tick 0] [set v-tick ticks mod 168]
ifelse (v-tick > 120) AND (v-tick mod 120 > 0) AND (v-tick mod 120 < 25) [set Weekend-name "SATURDAY"] [set Weekend-name "WEEKDAY"]
if (v-tick > 120) AND (v-tick mod 120 >= 25) AND (v-tick mod 120 < 49) [set Weekend-name "SUNDAY"]
end
to check-sleep
ask turtles [
ifelse (x-tick >= 1) and (x-tick < 9) [set status "sleeping"] [set status "awake"]
]
end
to check-location
ask boys [
if (x-tick >= 8) and (x-tick < 16) [
if (x-tick = 8) [set M-in-hour one-of Morning-List-B]
let until-m 9 + M-in-hour
ifelse (x-tick >= until-m) [set room-id "outdoor"] [set room-id "indoor"]
]
if (x-tick >= 16) or (x-tick = 1 ) [
if (x-tick = 16) [set N-in-hour one-of Night-List-B]
if (ticks < 336) and (x-tick = 16) [set N-in-hour (N-in-hour * 0.8)] ;assumed that on the first weeks students spend more time outside;
let until-n 16 + N-in-hour
ifelse (x-tick >= until-n) [set room-id "outdoor"] [set room-id "indoor"]
]
]
if (Weekend-name = "SATURDAY") or (Weekend-name = "SUNDAY") [
ask boys [
if (x-tick >= 8) and (x-tick < 16) [
if (x-tick = 8) [set M-in-hour one-of Morning-W-List-B]
if (ticks < 336) and (x-tick = 8) [set M-in-hour (M-in-hour * 0.8)]
let until-m 9 + M-in-hour
ifelse (x-tick >= until-m) [set room-id "outdoor"] [set room-id "indoor"]
]
if (x-tick >= 16) or (x-tick = 1 ) [
if (x-tick = 16) [set N-in-hour one-of Night-W-List-B]
if (ticks < 336) and (x-tick = 16) [set N-in-hour (N-in-hour * 0.8)] ;same assumption
let until-n 16 + N-in-hour
ifelse (x-tick >= until-n) [set room-id "outdoor"] [set room-id "indoor"]
]
]
if (ticks mod 121 = 0) [set home-sick-B turtle-set n-of (round(count boys * 0.2)) boys]
ask home-sick-B [
set room-id "outdoor"
;set color green
]
]
if (ticks = 0) [set ar-late-B turtle-set n-of (round(count boys * 0.2)) boys]
if (ticks > 288) [set ar-late-B no-turtles]
if (ticks >= 8) [ask ar-late-B [
set room-id "outdoor"
set color green ;only for control and verification!
]]
if (ticks < 2400) [set Holiday-B no-turtles]
if (ticks = 2400) [set Holiday-B turtle-set n-of (round(count boys * 0.1)) boys]
if (ticks = 2500) [set Holiday-B turtle-set n-of (round(count boys * 0.15)) boys]
if (ticks = 2600) [set Holiday-B turtle-set n-of (round(count boys * 0.2)) boys]
ask Holiday-B [
set room-id "outdoor"
set color red ;only for control and verification!
]
ask girls [
if (x-tick >= 8) and (x-tick < 16) [
if (x-tick = 8) [set M-in-hour one-of Morning-List-G]
let until-m 9 + M-in-hour
ifelse (x-tick >= until-m) [set room-id "outdoor"] [set room-id "indoor"]
]
if (x-tick >= 16) or (x-tick = 1 ) [
if (x-tick = 16) [set N-in-hour one-of Night-List-G]
if (ticks < 336) and (x-tick = 16) [set N-in-hour (N-in-hour * 0.8)] ;same assumption
let until-n 16 + N-in-hour
ifelse (x-tick >= until-n) [set room-id "outdoor"] [set room-id "indoor"]
]
]
if (Weekend-name = "SATURDAY") or (Weekend-name = "SUNDAY") [
ask girls [
if (x-tick >= 8) and (x-tick < 16) [
if (x-tick = 8) [set M-in-hour one-of Morning-W-List-G]
if (ticks < 288) and (x-tick = 8) [set M-in-hour (M-in-hour * 0.8)] ;same assumption
let until-m 9 + M-in-hour
ifelse (x-tick >= until-m) [set room-id "outdoor"] [set room-id "indoor"]
]
if (x-tick >= 16) or (x-tick = 1 ) [
if (x-tick = 16) [set N-in-hour one-of Night-W-List-G]
if (ticks < 336) and (x-tick = 16) [set N-in-hour (N-in-hour * 0.8)] ;same assumption
let until-n 16 + N-in-hour
ifelse (x-tick >= until-n) [set room-id "outdoor"] [set room-id "indoor"]
]
]
if (ticks mod 121 = 0) [set home-sick-G turtle-set n-of (round(count girls * 0.2)) girls]
ask home-sick-G [set room-id "outdoor"]
]
if (ticks < 2400) [set Holiday-G no-turtles]
if (ticks = 2400) [set Holiday-G turtle-set n-of (round(count boys * 0.1)) girls]
if (ticks = 2500) [set Holiday-G turtle-set n-of (round(count boys * 0.15)) girls]
if (ticks = 2600) [set Holiday-G turtle-set n-of (round(count boys * 0.2)) girls]
ask Holiday-G [
set room-id "outdoor"
set color yellow
]
end
to move-turtles
ask boys [
ifelse room-id = "outdoor" [move-to one-of Outside] [move-to one-of B-dorm]
if status = "sleeping" [
setxy -12 16
]
]
ask girls [
ifelse room-id = "outdoor" [move-to one-of Outside] [move-to one-of G-dorm]
if status = "sleeping" [
setxy 12 16
]
]
end
to consume-energy
ask boys [
if (status = "awake") and (room-id = "indoor") [daily-b-consume]
]
ask girls [
if (status = "awake") and (room-id = "indoor") [daily-g-consume]
]
ask turtles [
if (ticks mod 24 = 6) [set e-cons 0]
]
end
to daily-b-consume
if (ticks mod 24 = 9) [
set e-cons e-cons + (Coffee-maker-Kettle * (one-of Kettle-Use-B))
set e-cons e-cons + (Laptop-B * (M-in-hour) * (one-of Laptop-Use-B))
set e-cons e-cons + (Electric_Cooker * (one-of Kitchen-Use-B))
]
if (ticks mod 24 = 16) [
set e-cons e-cons + (Light-bulb * N-in-hour)
set e-cons e-cons + (Laptop-B * (N-in-hour) * (one-of Laptop-Use-B))
set e-cons e-cons + ((Shaver + Hair_Dryer / 2) * (one-of Hair-Use-B))
set e-cons e-cons + ((Phone-charger + Tablet-charger) * 2)
]
end
to daily-g-consume
if (ticks mod 24 = 9) [
set e-cons e-cons + (Coffee-maker-Kettle * (one-of Kettle-Use-G))
set e-cons e-cons + (Laptop-G * (M-in-hour) * (one-of Laptop-Use-G))
set e-cons e-cons + (Electric_Cooker * (one-of Kitchen-Use-G))
]
if (ticks mod 24 = 16) [
set e-cons e-cons + (Light-bulb * N-in-hour)
set e-cons e-cons + (Laptop-G * (N-in-hour) * (one-of Laptop-Use-G))
set e-cons e-cons + ((Shaver + Hair_Dryer) * (one-of Hair-Use-G))
set e-cons e-cons + ((Phone-charger + Tablet-charger) * 2) ;generally it takes around 2 hours each day!
]
end
to-report b-consumption
if (ticks mod 24 = 3) [
let daily-b-cons sum [e-cons] of boys
set daily-b-cons daily-b-cons
report daily-b-cons
] ;It not necessary to make things hard like, but this function helps a lot when running multiple simulation simultaneously in BehaviorSpace
end
to-report g-consumption
if (ticks mod 24 = 3) [
let daily-g-cons sum [e-cons] of girls
set daily-g-cons daily-g-cons
report daily-g-cons
]
end
to-report location
report [room-id] of turtle 0
end
to-report condition
report [status] of turtle 0
end
to initialize-time
clear-output
output-print Start-time
end
to show-time ; only for control and verificatoin; disable them if fewer than 4 agents are considered or it will cause error!
clear-output
output-print Current-time
output-print Weekend-name
output-type "M-in-hour: " output-type [M-in-hour] of turtle 0 output-type " " output-type [M-in-hour] of turtle 1 output-type " "
output-type [M-in-hour] of turtle 2 output-type " " output-type [M-in-hour] of turtle 3 output-type " "
output-type [M-in-hour] of turtle 4 output-type "---" output-type [e-cons] of turtle 1
output-print " "
output-type "N-in-hour: " output-type [N-in-hour] of turtle 0 output-type " " output-type [N-in-hour] of turtle 1 output-type " "
output-type [N-in-hour] of turtle 2 output-type " " output-type [N-in-hour] of turtle 3 output-type " "
output-type [N-in-hour] of turtle 4
end